#pragma once
#include<iostream>
template<typename T>
class MyVector
{
public:
    MyVector(int size = 3) {
        this->data = new T[size];
        if (data == NULL) { 
            printf("new fail");
            return;
        }
        this->current_pos = -1;
        this->length = size;
        cout << "MyVector<T>" << endl;
    }

    ~MyVector() {
        clear();
        cout << "~MyVector<T>" << endl;
    }

    // 访问
    T& at(int index) const {
        if (index<0 || index>current_pos+1) {
            printf("index: %d out of range\n", index);
            exit(0);
        }
        return data[index];
    }
    T& front() const {
        return data[0];
    }
    T& back() const {
        return data[length];
    }
    T& operator[](int index) {
        //边界检查：
        if (index<0||index>current_pos+1) {
            printf("index: %d out of range\n",index);
            exit(1);//存疑，如何返回
        }
        return data[index];
    }

    // 容量
    bool empty() const {//判空
        return current_pos == -1;
    }
    int size() const {
        return length;
    }
    int capacity() const {//当前元素个数
        if (current_pos==-1)
        {return 0;}
        return (current_pos+1);
    }

    // 修改
    void clear();//清空元素并置0，保留容量length
    void insert(int index, const T& d);
    void remove(int index);
    void push_back(const T& d);
    void pop_back();
    void Expand();//扩容

private:
    T* data=nullptr;
    int length;//用于维护数组最大大小（容量）
    int current_pos = -1;//用于维护数组表尾(默认为-1)
                       
};

/**
 * 类外实现模板函数注意：
 * 1. 需要使用 template<typename T>
 * 2. 要添加类名并且带模板参数 MyVector<T>::
*/